/**
 *  @(#)  IFAAAuthenticator  module    1.0  2017/03/24
 *
 *  Copyright  (c)  2017,  IFAA  and/or  its  affiliates.  All  rights  reserved.
 *
 *  Redistribution  and  use  in  source  and  binary  forms,  with  or  without
 *  modification,  are  permitted  provided  that  the  following  conditions  are  met:
 *
 *  -Redistribution  of  source  code  must  retain  the  above  copyright  notice,  this
 *    list  of  conditions  and  the  following  disclaimer.
 *
 *  -Redistribution  in  binary  form  must  reproduce  the  above  copyright  notice,
 *    this  list  of  conditions  and  the  following  disclaimer  in  the  documentation
 *    and/or  other  materials  provided  with  the  distribution.
 *
 *  Neither  the  name  of  IFAA  or  the  names  of  contributors  may
 *  be  used  to  endorse  or  promote  products  derived  from  this  software  without
 *  specific  prior  written  permission.
 *
 *  This  software  is  provided  "AS  IS,"  without  a  warranty  of  any  kind.  ALL
 *  EXPRESS  OR  IMPLIED  CONDITIONS,  REPRESENTATIONS  AND  WARRANTIES,  INCLUDING
 *  ANY  IMPLIED  WARRANTY  OF  MERCHANTABILITY,  FITNESS  FOR  A  PARTICULAR  PURPOSE
 *  OR  NON-INFRINGEMENT,  ARE  HEREBY  EXCLUDED.  IFAA,  ORG.
 *  AND  ITS  LICENSORS  SHALL  NOT  BE  LIABLE  FOR  ANY  DAMAGES  SUFFERED  BY  LICENSEE
 *  AS  A  RESULT  OF  USING,  MODIFYING  OR  DISTRIBUTING  THIS  SOFTWARE  OR  ITS
 *  DERIVATIVES.  IN  NO  EVENT  WILL  IFAA  OR  ITS  LICENSORS  BE  LIABLE  FOR  ANY  LOST
 *  REVENUE,  PROFIT  OR  DATA,  OR  FOR  DIRECT,  INDIRECT,  SPECIAL,  CONSEQUENTIAL,
 *  INCIDENTAL  OR  PUNITIVE  DAMAGES,  HOWEVER  CAUSED  AND  REGARDLESS  OF  THE  THEORY
 *  OF  LIABILITY,  ARISING  OUT  OF  THE  USE  OF  OR  INABILITY  TO  USE  THIS  SOFTWARE,
 *  EVEN  IF  IFAA  HAS  BEEN  ADVISED  OF  THE  POSSIBILITY  OF  SUCH  DAMAGES.
 *
 *  You  acknowledge  that  this  software  is  not  designed,  licensed  or  intended
 *  for  use  in  the  design,  construction,  operation  or  maintenance  of  any
 *  nuclear  facility.
 *
 */
package org.ifaa.android.manager.fingerprint;

import java.security.Signature;

import javax.crypto.Cipher;
import javax.crypto.Mac;

import android.content.Context;
import android.os.CancellationSignal;
import android.os.Handler;

public abstract class IFAAFingerprintManager {
    @SuppressWarnings("unused")
    private Context privateContext;

    public IFAAFingerprintManager(Context paramContext) {
        privateContext = paramContext;
    }

    public abstract void authenticate(IFAACryptoObject paramIFAACryptoObject,
                                      CancellationSignal paramCancellationSignal, int paramInt,
                                      IFAAAuthenticationCallback paramIFAAAuthenticationCallback,
                                      Handler paramHandler);

    public abstract void cancel();

    public abstract boolean hasEnrolledFingerprints();

    public abstract boolean isHardwareDetected();

    public static abstract class IFAAAuthenticationCallback {
        public void onAuthenticationAcquired(int paramInt) {
        }

        public void onAuthenticationError(int paramInt, CharSequence paramCharSequence) {
        }

        public void onAuthenticationFailed() {
        }

        public void onAuthenticationHelp(int paramInt, CharSequence paramCharSequence) {
        }

        public void onAuthenticationSucceeded(IFAAFingerprintManager.IFAAAuthenticationResult paramIFAAAuthenticationResult) {
        }
    }

    public static class IFAAAuthenticationResult {
        private IFAAFingerprintManager.IFAACryptoObject mCryptoObject;
        private IFAAFingerprint mFingerprint;

        public IFAAAuthenticationResult(IFAAFingerprintManager.IFAACryptoObject paramIFAACryptoObject,
                                        IFAAFingerprint paramIFAAFingerprint) {
            this.mCryptoObject = paramIFAACryptoObject;
            this.mFingerprint = paramIFAAFingerprint;
        }

        public IFAAFingerprintManager.IFAACryptoObject getCryptoObject() {
            return this.mCryptoObject;
        }

        public IFAAFingerprint getFingerprint() {
            return this.mFingerprint;
        }
    }

    public static class IFAACryptoObject {
        private final Object mCryptoObject;

        public IFAACryptoObject(Signature paramSignature) {
            this.mCryptoObject = paramSignature;
        }

        public IFAACryptoObject(Cipher paramCipher) {
            this.mCryptoObject = paramCipher;
        }

        public IFAACryptoObject(Mac paramMac) {
            this.mCryptoObject = paramMac;
        }

        public Cipher getCipher() {
            if ((this.mCryptoObject instanceof Cipher)) {
                return (Cipher) this.mCryptoObject;
            }
            return null;
        }

        public Mac getMac() {
            if ((this.mCryptoObject instanceof Mac)) {
                return (Mac) this.mCryptoObject;
            }
            return null;
        }

        public Signature getSignature() {
            if ((this.mCryptoObject instanceof Signature)) {
                return (Signature) this.mCryptoObject;
            }
            return null;
        }
    }
}
